function Player(_idPlayer, _namePlayer, _lat, _long, _isEnemy){

	var MapModule = require('ti.map');
	
	var AnnotationType = require('ui/model/constants/AnnotationType');
	var MotorcycleConstants = require('ui/model/constants/MotorcycleConstants');
	var TankConstants = require('ui/model/constants/TankConstants');
	var TroopConstants = require('ui/model/constants/TroopConstants');
	var PlayerConstants = require('ui/model/constants/PlayerConstants');
	
	var Troop = require('ui/model/Troop');
	var Tank = require('ui/model/Tank');
	var Motorcycle = require('ui/model/Motorcycle');
	
	
	//Si no esta definido el nombre de usuario se utiliza el ID
	if ((_namePlayer===undefined) || (_namePlayer===null)) { 
		_namePlayer= 'Jugador ' + _idPlayer;
	}
	
	
	var _type;
	
	if (_isEnemy){
		_type = AnnotationType.ANNOTATION_ENEMY_PLAYER;
	}
	else{
		_type = AnnotationType.ANNOTATION_PLAYER;
	}
	
	
	var self = {
		type : _type, //AnnotationType.ANNOTATION_PLAYER, //Tipo de Anotacion
		enemy: _isEnemy,	
		id : _idPlayer,	
		name : _namePlayer,
		
		troopsBuilding: [],	
		
		life: PlayerConstants.INITIAL_LIFE_POINTS,
		monetaryPoints : PlayerConstants.INITIAL_MONETARY_POINTS,
		actionPoints : PlayerConstants.INITIAL_ACTION_POINTS,
		
		view : null, 		//referencia a la instacia de la Vista
		
		latitude : _lat,
		longitude : _long,
		
		
		//Devuelve el mayor ID de las Tropas que se estan construyendo 
		getMaxIDTroopsBuilding: function (){
			var maxId = 0;
			
			if (this.troopsBuilding.length > 0 ){
				
				maxId = this.troopsBuilding[0].id;
			
				//Recorre el Array de las Tropas para obtener el maximo ID
				for (i = 0; i < this.troopsBuilding.length; i++){
					if (maxId < this.troopsBuilding[i].id) {
						maxId = this.troopsBuilding[i].id;
					}
				}
			}
							
			return maxId; 
			
		},
		
		getCountTroopsBuilding: function(){
			
			return this.troopsBuilding.length;
			
		},
		
		//Metodos	
		//Crear las distintas Tropas
		createTroop:  function(troopType){	
			var troop = null;
			var troopId = 0;
			
			if (Ti.App.controller.getMaxIDTroops() > this.getMaxIDTroopsBuilding()){
				troopId = Ti.App.controller.getMaxIDTroops() + 1 ;
			}
			else{
				troopId = this.getMaxIDTroopsBuilding() + 1;
			};
			
			
			//Crea la nueva Tropa	
			switch(troopType) {
    			case AnnotationType.ANNOTATION_TANK:
    				//Verifica si los Puntos Monetarios alcanzan para crear la Tropa del tipo Tanque
    				if (this.monetaryPoints >= TankConstants.MONETARY_POINTS_COST_CREATE){
    					//Crea un tanque    				
    					troop = new Tank(troopId, this.id, false);
    					
    					//Resta los Puntos Monetarios utilizados para construir la Tropa
    					this.monetaryPoints = this.monetaryPoints - TankConstants.MONETARY_POINTS_COST_CREATE;
    				}
        			break;
    			case AnnotationType.ANNOTATION_MOTORCYCLE:
    				//Verifica si los Puntos Monetarios alcanzan para crear la Tropa del tipo Motocicleta
    				if (this.monetaryPoints >= MotorcycleConstants.MONETARY_POINTS_COST_CREATE){
    					//Crea una moto
        				troop = new Motorcycle(troopId, this.id, false);
        				
        				//Resta los Puntos Monetarios utilizados para construir la Tropa
    					this.monetaryPoints = this.monetaryPoints - MotorcycleConstants.MONETARY_POINTS_COST_CREATE;
        			}
        			break;
    			default:
    				//Por defecto crea una Tropa
    				//Verifica si los Puntos Monetarios alcanzan para crear la unidad tipo Tropa
   					if (this.monetaryPoints >= TroopConstants.MONETARY_POINTS_COST_CREATE){
   						//Crea una Tropa por defecto
       					troop = new Troop(troopId, this.id, false);
      				
       					//Resta los Puntos Monetarios utilizados para construir la Tropa
   						this.monetaryPoints = this.monetaryPoints - TroopConstants.MONETARY_POINTS_COST_CREATE;
       				}
			}
							
			if (troop!= null){
				//Agrega la Tropa creada al listado de Tropas en construccion
				this.troopsBuilding[this.troopsBuilding.length] = troop;
			}
			
			//Refresca los datos de la vista
			this.refreshView();
		},	
		
		//Construye las Tropas pendientes
		buildTroops : function(){
			var i = 0;
						
			//Recorre el array de Tropas en construccion
			for (i = 0; i < this.troopsBuilding.length ; i++){
				
				//Le resta una unidad de tiempo al tiempo faltante para la construccion de la Tropa
				this.troopsBuilding[i].timeToCreate = this.troopsBuilding[i].timeToCreate - 1;
				
				//Verifica si ya finalizo la construccion de la Tropa
				if (this.troopsBuilding[i].timeToCreate == 0){
				
					//Agrega la tropa al controlador
					Ti.App.controller.addTroop(this.troopsBuilding[i], this.id, this.latitude, this.longitude);
											
					//Quita la Tropa del array de Tropas en construccion
					//splice(index,howmanyRemove)
					this.troopsBuilding.splice(i,1);
					
					i = i-1;
				} 
			}
			
			//Refresca los datos de la vista
			this.refreshView();
		},		
		
		//Ciclo de Vida del Jugador.
		lifeCycle: function(){
			
			//Realiza todas las acciones cuando le toca el turno al jugador
			
			//Continua la construccion de las Tropas
			this.buildTroops();
			
			//Calcula los Puntos Monetarios
		
			//Refresca los datos de la vista
			this.refreshView();
		},
		
		//Devuelve un string con los datos del estado del jugador para visualizar como subtitulo del annotation
		getDetails: function(){
			if (self.enemy){
				return 'Vida: '+ self.life ;
			}else{
				return 'Vida: '+ self.life + '\nPuntos de Acción: ' + self.actionPoints + '\nPuntos Monetarios: ' + self.monetaryPoints;
			}
		},
		
		//Consume los puntos de accion indicados
		consumingActionPoints: function(_actionPoints){
			//Consume los puntos de accion indicados
			this.actionPoints = this.actionPoints - _actionPoints;
			
			//Refresca los datos de la vista
			this.refreshView();
		},
		
		//Refresca los datos de la vista
		refreshView: function(){
			if (this.view != null){
				this.view.refresh();
			}
		}
		
	};
	
	return self;

};

module.exports = Player;
